package com.hzit.loan.pay.controller;

import com.hzit.loan.pay.commonApi.req.PayQueryReq;
import com.hzit.loan.pay.commonApi.req.PayReq;
import com.hzit.loan.pay.commonApi.resp.PayNotifyData;
import com.hzit.loan.pay.commonApi.resp.PayResultData;
import com.hzit.loan.pay.commonApi.resp.RespVo;
import com.hzit.loan.pay.service.IPayService;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * 支付接口
 */
@RestController
@RequestMapping("/pay")
public class PayController {

    private Logger logger = LoggerFactory.getLogger(PayController.class);

    @Autowired
    private IPayService payService;

    /**
     * TODO 怎么解决：重复支付，幂等
     *
     * 网银支付接口（包含：支付宝，微信，银行的支付方式）
     * @param payReq
     * @return
     */
    @RequestMapping("/create")
    public RespVo<PayResultData> netBankPay(@Valid @RequestBody PayReq payReq){
        logger.info("#############接受到支付请求，请求参数:{}##############",payReq);
        RespVo<PayResultData> respVo = new RespVo<PayResultData>();

        // 1.定与接口请求参数，和返回参数

        //2.对接请求参数验证吧
        // 2.1 参数空判断；
        // 2.2 验证请求参数是否被串改；
        // 2.3 判断商户号是否存在，并且状态是否可用；
        // 2.4 判断是否支持该支付方式，并且状态是否可用。

        //3. 生成支付流水。
        //3.1 检查订单是否存在未支付的未支付或者支付中的流水。如果存在就返回
        //3.2 生成支付流水。


        //4.根据支付方式去调用对应的支付接口。
        // 4.1 封装接口请求参数。
        // 4.2 发送请求解析支付公司返回参数
        // 4.3 统一封装返回RespVo
        try {
            respVo = payService.doPay(payReq);
        } catch (Exception e) {
            logger.error("Exception",e);
            respVo.setCode(-1);
            respVo.setMsg(e.getMessage());
        }
        logger.info("处理完支付请求，返回参数:{}",respVo);
        return respVo;
    }


    /**
     *
     * 支付结果查询接口
     *
     * @param payQueryReq 支付流水号
     */
    @RequestMapping("/query")
    public RespVo<PayNotifyData> query(@Valid @RequestBody PayQueryReq payQueryReq){
        //1.判断参数

        RespVo<PayNotifyData> respVo =  payService.query(payQueryReq);

        return respVo;
    }


    /**
     *
     * 支付关闭接口
     *
     * @param
     */
    @RequestMapping("/close")
    public RespVo<?> close(){
        //1.判断参数

        RespVo<?> respVo =  payService.close();

        return respVo;
    }

}
